#include "Serveur.h"
#include <iostream>

Serveur::Serveur(QObject* parent): QObject(parent)
{
    socketServeur = new QTcpServer(this);
    pass = "";
    connect(socketServeur, SIGNAL(newConnection()), this, SLOT(nouvelleConnexion()));
}

Serveur::~Serveur()
{
    arreterServeur();
}

void Serveur::lancerServeur(int port, QString pass)
{
    connecte = socketServeur->listen(QHostAddress::Any, port);
    this->port = port;
    this->pass = pass;
}

void Serveur::arreterServeur()
{
    socketServeur->close();
    QList<SessionClientSurServeur*>::iterator ite = clients.begin();
    while(ite != clients.end())
    {
        SessionClientSurServeur* client = (*ite);
        client->kicker();
        ++ite;
    }
    qDeleteAll(clients.begin(), clients.end());
    clients.clear();
}

bool Serveur::isConnecte()
{
    return connecte;
}

QString Serveur::errorConnecte()
{
    return socketServeur->errorString();
}

void Serveur::envoyerMessageATous(const QString &message, const QString &couleurDate = "black")
{
    if(!message.isEmpty())
    {
        QListIterator<SessionClientSurServeur *> ite(clients);
        while(ite.hasNext())
        {
            if(ite.peekNext()->getConnecte())
                ite.peekNext()->recevoirEnvoyerATous("<font color=" + couleurDate + ">" + QDateTime::currentDateTime().toString("[dd/MM/yy] [HH:mm:ss] </font>") + message);
            ite.next();
        }
    }
}

void Serveur::kickerClient(QString nom)
{
    bool trouve = false;
    SessionClientSurServeur* client;
    QList<SessionClientSurServeur *>::Iterator ite2;
    ite2 = clients.begin();
    while(ite2 != clients.end() && !trouve)
    {
        client = *ite2;
        if(client->getConnecte())
        {
            if(client->getNom() == nom)
            {
                client->kicker();
                trouve = true;
            }
        }
        ite2++;
    }
}

void Serveur::nouvelleConnexion()
{
    SessionClientSurServeur *nouveauClient = new SessionClientSurServeur(socketServeur->nextPendingConnection(), this);
    clients << nouveauClient;
}

void Serveur::envoyerATous(QString message)
{
    envoyerMessageATous(message);
}

QString Serveur::demandeConnexion(const QString & ip, const QString & pseudo, const QString & passw) // MUTEX?
{
    if(pass != "")
    {
        if(QString::compare(passw, pass, Qt::CaseSensitive) != 0)
        {
            emit logServeur("Connexion refusée pour " + ip + " (pass invalide).<br/>pseudo: " + pseudo + "<br/>password: " + passw);
            return "mot de passe invalide";
        }
        else
        {
            if(pseudo == "")
            {
                emit logServeur("Connexion refusée pour " + ip + " (pseudo vide).<br/>pseudo: " + pseudo + "<br/>password: " + passw);
                return "pseudo vide";
            }
            QListIterator<SessionClientSurServeur *> ite(clients);
            while(ite.hasNext())
            {
                if(ite.peekNext()->getConnecte() && QString::compare(pseudo, ite.peekNext()->getNom(), Qt::CaseSensitive) == 0)
                {
                    emit logServeur("Connexion refusée pour " + ip + " (pseudo déja utilisé).<br/>pseudo: " + pseudo + "<br/>password: " + passw);
                    return "pseudo déja utilisé";
                }
                ite.next();
            }
            emit nouveauClient(pseudo, ip);
            emit logServeur("Connexion acceptée pour " + ip + "<br/>pseudo: " + pseudo + "<br/>password: " + passw);
            envoyerMessageATous("<strong>"+ pseudo +" est connecté(e).</strong>", "green");

            return "ok";
        }
    }
    else
    {
        return demandeConnexion(ip, pseudo);
    }
}


QString Serveur::demandeConnexion(const QString & ip, const QString & pseudo)// MUTEX?
{  
    if(pass == "")
    {
        if(pseudo.isEmpty())
        {
            emit logServeur("Connexion refusée pour " + ip + " (pseudo vide).<br/>pseudo: " + pseudo);
            return "pseudo vide";
        }
        QListIterator<SessionClientSurServeur *> ite(clients);
        while(ite.hasNext())
        {
            if(ite.peekNext()->getConnecte() && QString::compare(pseudo, ite.peekNext()->getNom(), Qt::CaseSensitive) == 0)
            {
                emit logServeur("Connexion refusée pour " + ip + " (pseudo déja utilisé).<br/>pseudo: " + pseudo);
                return "pseudo déja utilisé";
            }
            ite.next();
        }
        emit logServeur("Connexion acceptée pour " + ip + "<br/>pseudo: " + pseudo);
        emit nouveauClient(pseudo, ip);
        envoyerMessageATous("<strong>"+ pseudo +" est connecté(e).</strong>", "green");
        return "ok";
    }
    else
    {
        emit logServeur("Connexion refusée pour " + ip + " (mot de passe requis).<br/>pseudo: " + pseudo);
        return "mot de passe requis";
    }
}


void Serveur::deconnexionClient(SessionClientSurServeur * client)
{
    if(client->getConnecte()) envoyerMessageATous("<strong>"+ client->getNom() + " est déconnecté(e).</strong>", "red");
    emit enleverClient(client->getNom());
    clients.removeOne(client);
    client->deleteLater();
}
